﻿%{
    #include "SA.tab.h"
    char tec_predlog[6];
    char str[30];
    struct padej_forma
    {
		char padej[3];
		char ipforma[30];
	};
%}
%option noyywrap

LANDSHAFT_1 равнин(а|ы|е|у|ой)?|рек(а|и|е|у|ой)|дорог(а|и|е|у|ой)|гор(ы|ам|ами|ах)?|скал(ы|ам|ами|ах)?|долин(а|ы|е|у|ой)?
LANDSHAFT_2 мир(а|у|ом|е)?|лес(а|у|ом|е)?|город(а|у|ом|е)?
LANDSHAFT_3 мест(о|а|у|ом|е)|болот(о|а|у|ом|е)|озер(о|а|у|ом|е)
NAPRAVLENIE_S север(а|у|ом|е)?|юг(а|у|ом|е)?|восток(а|у|ом|е)?|запад(а|у|ом|е)?|северо-запад(а|у|ом|е)?|северо-восток(а|у|ом|е)?|юго-запад(а|у|ом|е)?|юго-восток(а|у|ом|е)?
NAPRAVLENIE_PRIL северн(ая|ой|ую)?|южн(ая|ой|ую)?|восточн(ая|ой|ую)?|западн(ая|ой|ую)?|северо-западн(ая|ой|ую)?|северо-восточн(ая|ой|ую)?|юго-западн(ая|ой|ую)?|юго-восточн(ая|ой|ую)?
NAPRAVLENIE_SRAVN севернее|южнее|западнее|восточнее|северо-западнее|северо-восточнее|юго-западнее|юго-восточнее

ZONA зона

PREDLOG_RP без|у|от|около|из|возле|подле|с
PREDLOG_DP к|по
PREDLOG_VP про|через|за|в|на
PREDLOG_TP над|под|перед
PREDLOG_PP об|о|при

GLAGOL_RASPOLOJENIYA находится
GLAGOL_RAZMEROV простирается|расстилается|тянется
GLAGOL_PROTAJENIYA тянутся|течет|"несет свои воды"|идет|ведет

ZAG_GLAGOL_RASPOLOJENIYA Находится
ZAG_GLAGOL_RAZMEROV Простирается|Расстилается|Тянется
ZAG_GLAGOL_PROTAJENIYA Тянутся|Течет|"Несет свои воды"|Идет|Ведет

CHAST_3 част(ь|и|ью)

CHISLO [0-9]+
EDINICA_DLINY км


VYSOTA "с севера на юг"
SHIRINA "с запада на восток"

ZAG_VYSOTA "С севера на юг"
ZAG_SHIRINA "С запада на восток"

ZAG_SLOVO [А-Я]([а-я]+)?
SLOVO [а-я]+
TOCHKA \.
ZAP ","
SLASH "\""
SLASH2 "/"
DEFIS "-"
%s IP RP DP VP TP PP 
%%
<INITIAL>{LANDSHAFT_1} {   /* Тип ландшафта первого склонения. Дорога и река только в единственном числе. Горы - только во множественном (отдельная гора будет точечным объектом). */
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma));  
						   if(yytext[strlen(yytext)-1]=='а')
						   {
						       strcpy(yylval.Padej_Forma->padej,"IP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);					       
						   }
						   if(yytext[strlen(yytext)-1]=='ы')
						   {
							   strcpy(yylval.Padej_Forma->padej,"IP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   return LANDSHAFT_1;
					   }
<RP>{LANDSHAFT_1}  {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='ы'||yytext[strlen(yytext)-1]=='и')
						   {	   
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'а'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   /* нулевое окончание */
						   if(!strcmp(yytext,"гор")||!strcmp(yytext,"скал")) 
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)+1] = 'ы'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-3]=='а' && yytext[strlen(yytext)-2]=='м' && yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-3] = 'ы'; str[strlen(yytext)-2] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_1;
					}
<DP>{LANDSHAFT_1}	{
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'а'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(yytext[strlen(yytext)-2]=='а' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'ы'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_1;
					}
<VP>{LANDSHAFT_1} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='у')
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'а'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(yytext[strlen(yytext)-1]=='ы')
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext); // восстановление ИП
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-3]=='а' && yytext[strlen(yytext)-2]=='м' && yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-3] = 'ы'; str[strlen(yytext)-2] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'а'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }						   					   
						   if(yytext[strlen(yytext)-2]=='а' && yytext[strlen(yytext)-1]=='х')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'ы'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_1;
				  }
<TP>{LANDSHAFT_1} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(yytext[strlen(yytext)-3]=='а' && yytext[strlen(yytext)-2]=='м' && yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-3] = 'ы'; str[strlen(yytext)-2] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }	
						   BEGIN INITIAL;
						   return LANDSHAFT_1;
				  }	   
<PP>{LANDSHAFT_1} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'а'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if(yytext[strlen(yytext)-2]=='а' && yytext[strlen(yytext)-1]=='х')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'ы'; str[strlen(yytext)-1] = '\0'; // восстановление ИП
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_1;
			    }
<INITIAL>{LANDSHAFT_2} {   
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma));
						   if(!strcmp(yytext,"мир")||!strcmp(yytext,"лес")||!strcmp(yytext,"город"))
						   {					   
						       strcpy(yylval.Padej_Forma->padej,"IP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   return LANDSHAFT_2;
					   }
<RP>{LANDSHAFT_2}  {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='а')
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_2;
					}
<DP>{LANDSHAFT_2}	{
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='у')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_2;
					}
<VP>{LANDSHAFT_2} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(!strcmp(yytext,"мир")||!strcmp(yytext,"лес"))
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }						   					   
						   BEGIN INITIAL;
						   return LANDSHAFT_2;
				  }
<TP>{LANDSHAFT_2} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma));
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;	
						   return LANDSHAFT_2;
				}
<PP>{LANDSHAFT_2} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_2;
			    }
<INITIAL>{LANDSHAFT_3} {   
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='о')
						   {					   
						       strcpy(yylval.Padej_Forma->padej,"IP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   return LANDSHAFT_3;
					   }
<RP>{LANDSHAFT_3}  {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='а')
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'о';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_3;
					}
<DP>{LANDSHAFT_3}	{
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='у')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'о';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_3;
					}
<VP>{LANDSHAFT_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='о')
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
						       strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'о';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }						   					   
						   BEGIN INITIAL;
						   return LANDSHAFT_3;
				  }
<TP>{LANDSHAFT_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;	
						   return LANDSHAFT_3;
				}
<PP>{LANDSHAFT_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = 'о';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   BEGIN INITIAL;
						   return LANDSHAFT_3;
			    }			    
<INITIAL>{CHAST_3} { /*для части важен только падеж а не смысл*/
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='ь')
						   {
							   strcpy(yylval.Padej_Forma->padej,"IP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP; // всегда род падеж т к часть ЧЕГО
						   }
						   return CHAST_3;
					   }
<RP>{CHAST_3}  {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-2]=='ь' && yytext[strlen(yytext)-1]=='ю')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						   return CHAST_3;
					}
<DP>{CHAST_3}	{
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						   return CHAST_3;				
				}
<VP>{CHAST_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='ь')
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='ь' && yytext[strlen(yytext)-1]=='ю')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }	
						   return CHAST_3;					   					   
				  }
<TP>{CHAST_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='ь' && yytext[strlen(yytext)-1]=='ю')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }	
						   return CHAST_3;
				}
<PP>{CHAST_3} {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='и')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
							   BEGIN RP;
						   }
						   return CHAST_3;
			    }
<INITIAL>{NAPRAVLENIE_S} { 
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   /* нулевое окончание */
						   if(!strcmp(yytext,"север")||!strcmp(yytext,"юг")||!strcmp(yytext,"запад")||!strcmp(yytext,"восток")||!strcmp(yytext,"северо-восток")||!strcmp(yytext,"северо-запад")||!strcmp(yytext,"юго-восток")||!strcmp(yytext,"юго-запад")) 
						   {
							   strcpy(yylval.Padej_Forma->padej,"IP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   return NAPRAVLENIE_S;
					   }
<RP>{NAPRAVLENIE_S}  {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='а')
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   if(!strcmp(tec_predlog,"с")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_S;
					}
<DP>{NAPRAVLENIE_S}	{
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma));
						   if(yytext[strlen(yytext)-1]=='у')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_S;
					}
<VP>{NAPRAVLENIE_S} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(!strcmp(yytext,"север")||!strcmp(yytext,"юг")||!strcmp(yytext,"запад")||!strcmp(yytext,"восток")||!strcmp(yytext,"северо-восток")||!strcmp(yytext,"северо-запад")||!strcmp(yytext,"юго-восток")||!strcmp(yytext,"юго-запад")) 
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_S;						   					   
				  }
<TP>{NAPRAVLENIE_S} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='м')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }	
						   return NAPRAVLENIE_S;
				}
<PP>{NAPRAVLENIE_S} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-1]=='е')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-1] = '\0';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_S;
			    }
<INITIAL>{NAPRAVLENIE_PRIL} { 
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   /* нулевое окончание */
						   if(yytext[strlen(yytext)-2]=='а' && yytext[strlen(yytext)-1]=='я') 
						   {
							   strcpy(yylval.Padej_Forma->padej,"IP");
							   strcpy(yylval.Padej_Forma->ipforma,yytext);
						   }
						   return NAPRAVLENIE_PRIL;
					   }
<RP>{NAPRAVLENIE_PRIL}  {
						   yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"RP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						    /* повторяющийся предлог "с" проверка по окончанию */
						   return NAPRAVLENIE_PRIL;
					}
<DP>{NAPRAVLENIE_PRIL}	{
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"DP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_PRIL;
					}
<VP>{NAPRAVLENIE_PRIL} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='у' && yytext[strlen(yytext)-1]=='ю') 
						   {
							   strcpy(yylval.Padej_Forma->padej,"VP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   /* повторяющиеся предлоги "за","в","на" проверка по окончанию */
						   if(!strcmp(tec_predlog,"за")&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   if((!strcmp(tec_predlog,"в")||!strcmp(tec_predlog,"на"))&& yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }		
						   return NAPRAVLENIE_PRIL;			   					   
				  }
<TP>{NAPRAVLENIE_PRIL} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"TP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }	
						   return NAPRAVLENIE_PRIL;
				}
<PP>{NAPRAVLENIE_PRIL} {
							yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						   if(yytext[strlen(yytext)-2]=='о' && yytext[strlen(yytext)-1]=='й')
						   {
							   strcpy(yylval.Padej_Forma->padej,"PP");
							   strcpy(str,yytext);
							   str[strlen(yytext)-2] = 'а'; str[strlen(yytext)-1] = 'я';
							   strcpy(yylval.Padej_Forma->ipforma,str);
						   }
						   return NAPRAVLENIE_PRIL;
			    }

{NAPRAVLENIE_SRAVN} {
						yylval.Padej_Forma = (struct padej_forma*)malloc(sizeof(struct padej_forma)); 
						strcpy(yylval.Padej_Forma->padej,"IP");
						strcpy(yylval.Padej_Forma->ipforma,yytext); 
						BEGIN RP;
						return NAPRAVLENIE_SRAVN;
					}
				
{GLAGOL_RASPOLOJENIYA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return GLAGOL_RASPOLOJENIYA;}
{GLAGOL_RAZMEROV} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return GLAGOL_RAZMEROV;}
{GLAGOL_PROTAJENIYA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return GLAGOL_PROTAJENIYA;}

{ZAG_GLAGOL_RASPOLOJENIYA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_GLAGOL_RASPOLOJENIYA;}
{ZAG_GLAGOL_RAZMEROV} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_GLAGOL_RAZMEROV;}
{ZAG_GLAGOL_PROTAJENIYA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_GLAGOL_PROTAJENIYA;}

{VYSOTA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return VYSOTA;}
{SHIRINA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return SHIRINA;}

{ZAG_VYSOTA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_VYSOTA;}
{ZAG_SHIRINA} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_SHIRINA;}

{EDINICA_DLINY} {BEGIN INITIAL; yylval.CharPointer = (char*)malloc(3*sizeof(char)); strcpy(yylval.CharPointer,yytext); return EDINICA_DLINY;}
{CHISLO} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext);return CHISLO;}


{PREDLOG_RP} { strcpy(tec_predlog,yytext); BEGIN RP; yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return PREDLOG_RP;}
{PREDLOG_DP} { strcpy(tec_predlog,yytext); BEGIN DP; yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return PREDLOG_DP;}
{PREDLOG_VP} { strcpy(tec_predlog,yytext); BEGIN VP; yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return PREDLOG_VP;}
{PREDLOG_TP} { strcpy(tec_predlog,yytext); BEGIN TP; yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return PREDLOG_TP;}
{PREDLOG_PP} { strcpy(tec_predlog,yytext); BEGIN PP; yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return PREDLOG_PP;}

{ZONA} {yylval.CharPointer = (char*)malloc(6*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZONA;}
{ZAG_SLOVO} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return ZAG_SLOVO;}	
{SLOVO} {yylval.CharPointer = (char*)malloc(30*sizeof(char)); strcpy(yylval.CharPointer,yytext); return SLOVO;}

{DEFIS} {return DEFIS;}
{SLASH} {return SLASH;}
{SLASH2} {return SLASH2;}		
{ZAP} {return ZAP;}
{TOCHKA} {BEGIN INITIAL;  return TOCHKA;}
%%
